#
"""class A:
    def f(self,n):
        print(self,n)

        #self：<__main__.A object at 0x000001C61C771220>  对象的地址值
        #n ：5


if __name__ == '__main__':
    a = A()
    a.f(5)"""

class Teacher:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    def tea_info(self):
        print(f"大家好，我叫：{self.name}，今年：{self.age}，性别为：{self.sex}")
        """
        加了self以后，其他的类方法都可以找到实例属性，并且使用
        """
    def play(self,p):
        print(f"我们一起出去玩：{p}")
if __name__ == '__main__':
    # 通过Teacher类创建了zs对象
    zs = Teacher("张三",19,'男')
    # 使用这个对象调用tea_info方法
    # zs.tea_info()

    # 创建完类方法以后，可以把它当成一个普通函数，有形参就需要传递
    # zs.play("篮球")  # 通过zs对象调用的

    # 通过类直接调用类方法
    # Teacher.play(111,"篮球")
    """
    【这么传参是不规范的】
    play方法里有两个形参，一个是self，一个是p
    上面的传参内容：
                  self  == 111
                  p  == 篮球
    """
    # 可以手动把对象传进去
    # Teacher.play(zs,'足球')
    """
    在调用类方法的时候，一定要有类对象，才可以
    """

class Student:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    @classmethod
    def show_info(self,play):
        print(f"今天的天气比较好，我们一起出去玩：{play}")
    @staticmethod
    def add(num1,num2):
        """
        staticmethod：静态方法，在类方法上面标记了这个，表明是一个普通函数，不再是类方法了
        可以通过类直接调用，也可以通过对象调用
        :param num1:
        :param num2:
        :return:
        """
        return num1+num2
if __name__ == '__main__':
    # 不传入对象，直接调用类方法
    # Student.show_info("足球")
    """
    classmethod：是一个类方法装饰器
    在类方法上面加上了这个装饰器，可以直接通过类来去调用方法，不要传入对象了
    """

    # 通过类调用静态方法的函数
    print(Student.add(1, 2))

    # 通过Student类实例化的对象去调用
    s1 = Student("张三",19,"男")
    print(s1.add(1, 2))

    """
    staticmethod：在类方法上面加了静态方法装饰器，就是一个普通函数了
    """














